Coder Social home page Coder Social logo

xit's Introduction

Xit

Xit (pronounced "exit") is a graphical tool for working with git repositories. The overall goals are:

  • A useful graphical interface for viewing and managing your repository
  • Stability and scalability - handle large repositories well (lots of commits and lots of files)
  • A well-organized codebase to facilitate continued development

Background and current status

Screen shot

Xit began as a rewrite of GitX, born from a desire for a codebase that was easier to work with, thoroughly unit tested, etc. It is currently in beta, where most basic features are in place. You can check the GitHub issues and milestones to see what is planned.

Features

  • Sidebar showing branches, remotes, tags, submodules, and stashes.
    • If you sign in with your TeamCity account, you can see build status for branches you have pushed.
    • If you sign in with your Bitbucket Server account, you can see and act on pull requests.
    • Support for more services, such as GitHub, is in the works.
  • History list with a graph of commits and branches.
    • Search the list by author, message content, or hash.
    • Navigate backwards and forwards through your history of selected commits.
  • File lists and previews for workspace files and previous commits.
    • See just the files that changed, or use the outline view to browse the whole hierarchy at any commit.
    • Preview files as diffs, blame, plain text, or QuickLook.
    • Blame view has color coding to show lines that changed at the same time, and links back to the commit they came from.

Roadmap

The plan is to have a concrete 1.0 milestone to provide a good foundation and firm direction moving forward. Version 1.0 will simply be a starting point covering basic usage, plus some fun extras like the beginnigs of online service integration.

Plenty of advancements are on the post-1.0 list, like syntax highlighting and other diff view enhancements, file history, etc.

Some other ideas that Iโ€™m looking forward to working on (and using!):

  • More robust push and pull, and better handling of merge conflicts
  • Interacting more with git hosting services (especially GitHub): discovering forks, viewing commits online, working with pull requests
  • Interactive rebase
  • Explore more ways to navigate and visualize the repository

Please see the CONTRIBUTING.md file for information on building Xit and contributing to the project.

xit's People

Contributors

cntrump avatar laullon avatar mjcuva avatar nerandell avatar rahdev avatar uncommon avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

xit's Issues

Prompt for merge descriptions

As of git 1.7.10, git merge will always prompt for a description. Therefore, GUI apps should start doing the same.

Assume Unchanged

  • Add a command for applying the "assume unchanged" bit (git update-index --assume-unchanged) to workspace files.
  • Add an option to show which files have the "assume unchanged" bit, and a command to remove it.

Target Lion explicitly

The new file list uses a view-based table view, which requires 10.7. If we're going to do that, the target should be updated to explicitly use the 10.7 SDK.

Sidebar icons

  • Branch
  • Remote (network icon?)
  • Tag
  • Stash
  • Submodule

Should we use color icons, or Lion-style B&W icons?

Check out branches

Implement checking out a specific branch:

  • Add a context menu to branch items in the sidebar with a "Check out" command
  • Add a "Check out >" submenu to some menu in the menu bar (since, officially, every context menu command should also be available in the menu bar)

git remote prune UI

Provide a UI for git remote prune, which deletes local references to remote branches that have been deleted in the remote repository. The --dry-run option gives a list of branches that would be pruned, so we can use that to ask the user which of those should really be deleted.

Status display

Implement a list that effectively shows the output of git status -s.

Drag and drop operations

  • Drag another branch (or multiple*) to the current branch does a merge
  • Drag the current branch to another branch does a rebase
  • Drag a commit (or multiple*) to the current branch does a cherry-pick
  • Drag a commit to the Stage does a cherry-pick -n
  • Drag a branch to the Stage does a merge --squash

* We need to support selecting multiple branches and commits

Checkout branch

Implement checking out a branch by selecting it in the list from #2 and executing a command.

Different remote icons by type

  • Folder icon for remotes on the same disk/computer
  • Logos for hosting services - GitHub, Bitbucket, Google Code, etc.
  • Specific cons for ssh, http or git URLs

"Show commit online" command

  • Find which remote(s) the commit is on
  • Figure out which service a remote is (GitHub, Bitbucket, etc.) from its push/pull URL
  • Construct the commit URL and send it to the default browser

Stash button in stage view

I think it would be appropriate and convenient to put a Stash button above the Unstaged list in stage view.

testXTSideBarDataSourceBranchesAndTags failure

/Users/catmull/Source/local/Xit/XitTests/XTSideBarDataSorceTests.m:154:0 "(nt == 1)" should be true. found 0 tags FAIL
/Users/catmull/Source/local/Xit/XitTests/XTSideBarDataSorceTests.m:169:0 "tagT1Found" should be true. Tag 't1' Not found
/Users/catmull/Source/local/Xit/XitTests/XTSideBarDataSorceTests.m:176:0 "(nb == 2)" should be true. found 0 branches FAIL
/Users/catmull/Source/local/Xit/XitTests/XTSideBarDataSorceTests.m:194:0 "branchMasterFound" should be true. Branch 'master' Not found
/Users/catmull/Source/local/Xit/XitTests/XTSideBarDataSorceTests.m:195:0 "branchB1Found" should be true. Branch 'b1' Not found

Interactive rebase

Normall, git does interactive rebase by opening a text editor. It will probably have to work like this:

  • call git rebase -i with $EDITOR set to a custom tool that communicates with Xit
  • The tool passes the rebase list to Xit
  • Xit presents a UI which the user manipulates
  • When the user accepts, the tool quits, and git continues with the rebase

Handling the edit option might be tricky, but it could be done as in #23.

It's not clear to me how to handle canceling the rebase - that is, when the user clicks Cancel and we don't want to do anything at all. I suppose the tool could return the same list it was given, but we should make sure that doesn't change anything. That might not work when rebasing onto another branch.

NSLogs are not 32-bit friendly

Lots of NSLog statements assume that NSInteger types are 64-bit. In the Release build, which does 32-bit and 64-bit, this causes build warnings and probably other issues. Either fix them, or decide we don't need to build for 32-bit.

testXTSideBarDataSourceStashes failure (crash)

Test Case '-[XTSideBarDataSorceTests testXTSideBarDataSourceStashes]' started.
2011-09-02 10:14:36.537 Xit[10979:903] [createRepo] repoName=/var/folders/++/++1UA+++6+0++4RjPqRgNE++s1+/-Tmp-/testrepo
2011-09-02 10:14:36.538 Xit[10979:903] ****command = git init
2011-09-02 10:14:36.539 Xit[10979:903] task.currentDirectoryPath=/var/folders/++/++1UA+++6+0++4RjPqRgNE++s1+/-Tmp-/testrepo
2011-09-02 10:14:36.617 Xit[10979:903] **** status = 0
2011-09-02 10:14:36.617 Xit[10979:903] ****command = git add file1.txt
2011-09-02 10:14:36.617 Xit[10979:903] task.currentDirectoryPath=/var/folders/++/++1UA+++6+0++4RjPqRgNE++s1+/-Tmp-/testrepo
2011-09-02 10:14:36.690 Xit[10979:903] **** status = 0
2011-09-02 10:14:36.691 Xit[10979:903] ****command = git commit -m new file1.txt
2011-09-02 10:14:36.691 Xit[10979:903] task.currentDirectoryPath=/var/folders/++/++1UA+++6+0++4RjPqRgNE++s1+/-Tmp-/testrepo
2011-09-02 10:14:36.768 Xit[10979:903] **** status = 0
2011-09-02 10:14:36.769 Xit[10979:903] [createRepo] repoName=/var/folders/++/++1UA+++6+0++4RjPqRgNE++s1+/-Tmp-/remotetestrepo
2011-09-02 10:14:36.770 Xit[10979:903] ****command = git init
2011-09-02 10:14:36.770 Xit[10979:903] task.currentDirectoryPath=/var/folders/++/++1UA+++6+0++4RjPqRgNE++s1+/-Tmp-/remotetestrepo
2011-09-02 10:14:36.847 Xit[10979:903] **** status = 0
2011-09-02 10:14:36.848 Xit[10979:903] ****command = git add file1.txt
2011-09-02 10:14:36.849 Xit[10979:903] task.currentDirectoryPath=/var/folders/++/++1UA+++6+0++4RjPqRgNE++s1+/-Tmp-/remotetestrepo
2011-09-02 10:14:36.923 Xit[10979:903] **** status = 0
2011-09-02 10:14:36.924 Xit[10979:903] ****command = git commit -m new file1.txt
2011-09-02 10:14:36.924 Xit[10979:903] task.currentDirectoryPath=/var/folders/++/++1UA+++6+0++4RjPqRgNE++s1+/-Tmp-/remotetestrepo
2011-09-02 10:14:37.000 Xit[10979:903] **** status = 0
2011-09-02 10:14:37.000 Xit[10979:903] setUp ok
/Developer/Tools/RunPlatformUnitTests.include: line 269: 10979 Segmentation fault      "${TEST_HOST}" ${TEST_HOST_FLAGS} ${OTHER_TEST_FLAGS}
/Developer/Tools/RunPlatformUnitTests.include:339: error: Test host '/Users/catmull/Source/local/Xit/build/Debug/Xit.app/Contents/MacOS/Xit' exited abnormally with code 139 (it may have crashed).

View icons

  • History
  • Stage
  • Files

(Should Files really be a separate view, or an option under History? It's good to be able to view the file hierarchy at the selected commit.)

git checkout messes up stage diff

I found this because it happens in GitX too.

  • Check out an individual file from an older commit
  • Go to stage view - the file doesn't show up in the unstaged list
  • Make some changes to the file
  • Stage view only show the changes compared to the commit you checked out from

Xcode 4 handles this correctly - it shows the diff relative to the head of the current branch.

Implement commit

The Commit button in stage view is unconnected and needs an implementation.

Show file mode differences

Sometimes a file's mode may be changed (with chmod) without changing its content. Git recognizes this difference. The diff view should be updated to show mode changes.

Use mock repository for UI tests

The unit tests take a long time to run because each test does a lot of real git operations. We don't need to test our interaction with git every time, so most tests could use a mock repository to speed things up.

Move git parsing to XTRepository

The code that actually parses git output is in various places depending on the task. Instead, the parsing methods should be moved to XTRepository with callbacks to process the parsed data. This will make it more reusable and testable, and facilitates moving to libgit2 if/where appropriate.

testCommitWithTag failure

Test Case '-[XTCommitViewControllerTest testCommitWithTag]' started.
2011-09-02 10:14:16.019 Xit[10979:903] [createRepo] repoName=/var/folders/++/++1UA+++6+0++4RjPqRgNE++s1+/-Tmp-/testrepo
2011-09-02 10:14:16.023 Xit[10979:903] ****command = git init
2011-09-02 10:14:16.023 Xit[10979:903] task.currentDirectoryPath=/var/folders/++/++1UA+++6+0++4RjPqRgNE++s1+/-Tmp-/testrepo
2011-09-02 10:14:16.037 Xit[10979:903] **** status = 0
2011-09-02 10:14:16.037 Xit[10979:903] ****command = git add file1.txt
2011-09-02 10:14:16.038 Xit[10979:903] task.currentDirectoryPath=/var/folders/++/++1UA+++6+0++4RjPqRgNE++s1+/-Tmp-/testrepo
2011-09-02 10:14:16.111 Xit[10979:903] **** status = 0
2011-09-02 10:14:16.112 Xit[10979:903] ****command = git commit -m new file1.txt
2011-09-02 10:14:16.113 Xit[10979:903] task.currentDirectoryPath=/var/folders/++/++1UA+++6+0++4RjPqRgNE++s1+/-Tmp-/testrepo
2011-09-02 10:14:16.189 Xit[10979:903] **** status = 0
2011-09-02 10:14:16.190 Xit[10979:903] [createRepo] repoName=/var/folders/++/++1UA+++6+0++4RjPqRgNE++s1+/-Tmp-/remotetestrepo
2011-09-02 10:14:16.195 Xit[10979:903] ****command = git init
2011-09-02 10:14:16.195 Xit[10979:903] task.currentDirectoryPath=/var/folders/++/++1UA+++6+0++4RjPqRgNE++s1+/-Tmp-/remotetestrepo
2011-09-02 10:14:16.272 Xit[10979:903] **** status = 0
2011-09-02 10:14:16.273 Xit[10979:903] ****command = git add file1.txt
2011-09-02 10:14:16.273 Xit[10979:903] task.currentDirectoryPath=/var/folders/++/++1UA+++6+0++4RjPqRgNE++s1+/-Tmp-/remotetestrepo
2011-09-02 10:14:16.347 Xit[10979:903] **** status = 0
2011-09-02 10:14:16.348 Xit[10979:903] ****command = git commit -m new file1.txt
2011-09-02 10:14:16.348 Xit[10979:903] task.currentDirectoryPath=/var/folders/++/++1UA+++6+0++4RjPqRgNE++s1+/-Tmp-/remotetestrepo
2011-09-02 10:14:16.426 Xit[10979:903] **** status = 0
2011-09-02 10:14:16.427 Xit[10979:903] setUp ok
2011-09-02 10:14:16.427 Xit[10979:903] ****command = git tag -a TagNameTest -m ### message ###
2011-09-02 10:14:16.427 Xit[10979:903] task.currentDirectoryPath=/var/folders/++/++1UA+++6+0++4RjPqRgNE++s1+/-Tmp-/testrepo
2011-09-02 10:14:16.500 Xit[10979:903] **** status = 0
2011-09-02 10:14:16.501 Xit[10979:3c03] ****command = git show-ref -d
2011-09-02 10:14:16.502 Xit[10979:3c03] task.currentDirectoryPath=/var/folders/++/++1UA+++6+0++4RjPqRgNE++s1+/-Tmp-/testrepo
2011-09-02 10:14:16.510 Xit[10979:903] tearDown ok
Unknown.m:0: error: -[XTCommitViewControllerTest testCommitWithTag] : *** -[NSCFArray objectAtIndex:]: index (0) beyond bounds (0)
Test Case '-[XTCommitViewControllerTest testCommitWithTag]' failed (0.492 seconds).

Use commit hook scripts

Have options for running the various commit scripts:

  • pre-commit: intended to run "first" before the message editor is opened. This is difficult in a modeless context, especially if the script may be time-consuming. Maybe have a button to run manually, and an indicator to show if the script ran successfully since the last local change.
  • prepare-commit-msg: produces the initial commit message. Probably this should run when the message editor gains focus and is empty (or matches the template).
  • commit-msg: validates the commit message. Running automatically when the user pauses typing is probably good.
  • post-commit: after the commit is complete.

Split Xit class into XTDocument and XTRepository

  • Xit is the name of the application, so it shouldn't be the name of the document class
  • Conceptually I think the repository functionality should be separate, to isolate the part that communicates with git

Sidebar reload crash

Occasionally I see a crash when the sidebar is being reloaded. The stack trace is usually something like below. When I run again, it usually works fine. Perhaps reloadData shouldn't be called off the main thread?

Thread 5, Queue : com.xit.queue./Users/uncommon/Developer/Xit
#0  0x00007fff8a9e796c in void Auto::sieve_base::sieve_base_pointer<set_write_barrier_value_sieve>(Auto::Zone*, void const*, set_write_barrier_value_sieve&) ()
#1  0x00007fff8a9e17f7 in auto_zone_set_write_barrier ()
#2  0x00007fff8b03c441 in objc_assign_strongCast_gc ()
#3  0x00007fff8c1c3da0 in -[NSTableRowData _removeRowViewForRow:] ()
#4  0x00007fff8c189b62 in -[NSTableRowData _removeVisibleRows] ()
#5  0x00007fff8c1897e7 in -[NSTableRowData removeAllKnownSubviews] ()
#6  0x00007fff8c1895df in -[NSTableRowData reloadData] ()
#7  0x00007fff8c193fe1 in -[NSTableView reloadData] ()
#8  0x00007fff8c2e1afd in -[NSOutlineView reloadData] ()
#9  0x0000000100004754 in -[XTSideBarDataSource _reload] at /Users/uncommon/Developer/Xit/Xit/XTSideBarDataSource.m:64
#10 0x000000010000460f in __29-[XTSideBarDataSource reload]_block_invoke_0 ()
#11 0x00007fff89b658ba in _dispatch_call_block_and_release ()
#12 0x00007fff89b6710a in _dispatch_queue_drain ()
#13 0x00007fff89b66f66 in _dispatch_queue_invoke ()
#14 0x00007fff89b66760 in _dispatch_worker_thread2 ()
#15 0x00007fff851143da in _pthread_wqthread ()
#16 0x00007fff85115b85 in start_wqthread ()

"Show ignored files" option in stage view

Add an option to include ignored files (as in git ls-files --other) in the unstaged list of the stage view. They should appear different (e.g. gray text) to set them apart from regular files.

Extra credit: show where the rule is (which .gitignore file) that causes a file to be ignored.

  • Make the "Show ignored files" action menu command check and uncheck.
  • Add/remove ignored files in the list, maintaining the animation effect.
  • Give ignored files a distinct appearance. Currently deleted files are gray; maybe change deleted to red and make ignored files gray.

Fails on empty repository

In particular, there is a parse failure in -[XTHistaryDataSource reload].

2012-05-31 16:54:00.571 Xit[34361:2a03] *** Terminating app due to uncaught exception 'Invalid commint', reason: 'Line ***
fatal: bad default revision 'HEAD'

*** is invalid'

Hierarchical option for stage view

Add an option to show the unstaged (and staged?) list as a hierarchical list, showing all workspace files with indicators for changed/added/deleted.

Refresh command

Implement a Refresh command that reloads data from the repository.

Uncrustify adds spaces

I'm finding that uncrustify sometimes adds a space after certain function/macro names, like NSLog and STAssertNotNil. I'm not sure why it singles those out.

If uncrustify isn't totally trustworthy, I think it would be better to have it generate warnings instead of modifying files.

Show contents of new files

Currently, selecting a new file in the unstaged list shows nothing in the diff pane. The file's full contents should be shown with a similar appearance to the diff for modified files.

Render GitHub markdown files

Render .md files as GitHub markdown (or plain markdown) instead of plain text.

I got the idea from pieter/gitx#7 - I thought that was what they were doing, but they were just renaming a file :)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.