|
| 1 | +# Ideas for things to do |
| 2 | + |
| 3 | +## Bugs |
| 4 | + |
| 5 | +* Find some bugs and fix them :-) |
| 6 | + |
| 7 | +* Check that the capstone merge in a block outline is merged correctly. |
| 8 | + |
| 9 | + * Since the ancestry of its two parents is incomplete, Git would probably try to do a recursive merge. See if we can somehow do better without filling in the whole diagram. |
| 10 | + |
| 11 | + * Compare the merges that would come from continuing each side of the outline, and verify that they are identical. |
| 12 | + |
| 13 | + |
| 14 | +## Convenience features |
| 15 | + |
| 16 | +* Add a two-argument form of the `start` and `init` commands to specify both branches in one go. (Or maybe not, if we want to leave the way open to supporting octipus merges!) Maybe `--onto=X` like rebase? |
| 17 | + |
| 18 | +* Improve the handling of log messages. Incorporate log messages from manual merge conflicts into suggested log messages for the simplified commits. |
| 19 | + |
| 20 | +* Allow the user to specify which conflict they would like to resolve next, and set it up for them. |
| 21 | + |
| 22 | +* Allow the user to block certain merges, meaning that they should never be skipped over or merged automatically. |
| 23 | + |
| 24 | +* Add a `git imerge pause` that puts an imerge on hold and resets the working copy to a reasonable state. |
| 25 | + |
| 26 | +* Allow the user to specify a test that is run automatically after each automatic merge, (à la `git bisect run`). |
| 27 | + |
| 28 | + |
| 29 | +## New merge goals and styles |
| 30 | + |
| 31 | +* Add a `--goal=sparse` option that retains all of the conflicted merges and enough intermediate history to connect them. |
| 32 | + |
| 33 | +* Add an option that allows the user to resolve conflicts in larger chunks; for example, add a rebase-with-history-type merge where each branch commit is merged directly to its final location on the last master commit. (Perhaps `--conflicts={pairwise|fewest}`.) |
| 34 | + |
| 35 | +* Permit switching between goal/conflict choices when they are meaningful while prohibiting nonsensical ones. |
| 36 | + |
| 37 | + |
| 38 | +## Collaboration |
| 39 | + |
| 40 | +* Add `git imerge push REMOTE` to push the status of an in-progress merge to REMOTE. |
| 41 | + |
| 42 | +* Add `git imerge pull REMOTE` to pull the current state of an incremental merge from REMOTE. |
| 43 | + |
| 44 | +* Add some kind of `fetch`-like functionality that stores the result into a remote namespace. |
| 45 | + |
| 46 | +* The analogue of "non-fast-forward" for incremental merges is different than for other references. A `push`/`pull` should be prohibited if: |
| 47 | + |
| 48 | + * Any of the branches is updated in a non-fast-forward fashion. |
| 49 | + |
| 50 | + * Any commit `I1-I2` is updated (at all!) when there is an existing commit `I1'-I2'` with `I1' >= I1` and `I2' >= I2`. |
| 51 | + |
| 52 | + * As a safety precaution, the DAG of the retrieved merges should probably be checked for self-consistency (see `git imerge fsck` below). |
| 53 | + |
| 54 | +* Add smarter ways to reconcile two versions of an in-progress merge that are not fast-forwards of each other. Probably this should work with two arbitrary local merges (one of which is probably from a remote). |
| 55 | + |
| 56 | + |
| 57 | +## Flexibility |
| 58 | + |
| 59 | +* Allow commits to be skipped over when merging if, for example, they are broken (analogous to `git bisect skip`). This should be allowed when an imerge is being initialized and also after an imerge is in progress. |
| 60 | + |
| 61 | +* Allow arbitrary manual merge commits to be recorded, and be smarter about how such commits are integrated. |
| 62 | + |
| 63 | +* Allow recorded merges to be retroactively rejected, adjusting subsequent merges accordingly. |
| 64 | + |
| 65 | + * In first version, just discard all commits that depended on it. |
| 66 | + |
| 67 | + * In later versions, salvage parts of the subsequent merges when possible. |
| 68 | + |
| 69 | + |
| 70 | +### Relax `--first-parent` limitation |
| 71 | + |
| 72 | +* Allow recursive merges: if one of the `--first-parent` merges is itself a merge, maybe it can be "exploded" into individual commits and these commits merged with the second branch as part of the first merge or as a subsidiary merge. |
| 73 | + |
| 74 | +* Allow more complicated topologies in the two branches to be merged, and somehow form the appropriate Cartesian product of their commits with the correct ancestry. |
| 75 | + |
| 76 | + |
| 77 | +## Tools |
| 78 | + |
| 79 | +* `git imerge info` -- show a detailed, human-readable summary of all intermediate commits related to this imerge. |
| 80 | + |
| 81 | +* `git imerge parse M-N` -- show SHA-1 of the specified merge if it has been done. Maybe also `git imerge parse NAME/M-N`. |
| 82 | + |
| 83 | +* `git imerge show M-N` -- show more, human-readable info about the specified imerge. |
| 84 | + |
| 85 | +* `git imerge list -v` -- add more information to the display; for example, the goals, status, etc. of each imerge. |
| 86 | + |
| 87 | +* `git imerge status` -- show the current imerge status (issue #22). If the user has been asked to do a merge, show the log messages for the two original commits again. |
| 88 | + |
| 89 | + |
| 90 | +## Miscellaneous |
| 91 | + |
| 92 | +* Add a command `git imerge fsck` (for lack of a better name) that checks the consistency of the intermediate commits (especially their DAG). |
| 93 | + |
| 94 | +* Maybe expand diagram to 2x2 characters per merge, to make room for more information (e.g., block boundaries could go in the interstices). |
| 95 | + |
| 96 | +* Maybe fix PPM output. |
| 97 | + |
| 98 | +* Maybe keep a record of all merge attempts, successful and failed. |
| 99 | + |
| 100 | +* When running subprocesses, set a more specific value to environment variable `GIT_IMERGE` reflecting exactly what git-imerge is doing at the time (e.g., 'autofill', 'automerge', etc). See issue #17. |
| 101 | + |
| 102 | +* Add better tools and hints for getting out of a screwed-up merge attempt (see, e.g., issue #29). |
| 103 | + |
| 104 | + |
| 105 | +## Testing |
| 106 | + |
| 107 | +* Add a tool that can create two branches with conflicts at arbitrary places. (This is pretty easy--if commit I1-I2 should conflict, then make commits I1 and I2 both create a file `conflict-i1-i2` with differing contents. |
| 108 | + |
| 109 | +* Test adjacent conflicts in various places. |
| 110 | + |
| 111 | +* Cook up some way to make conflicts that unexpectedly appear and disappear when merged as part of a block vs. pairwise. (Maybe this can be done using commits involving file renames followed by the addition of replacements.) Test such scenarios. |
| 112 | + |
| 113 | + |
| 114 | +## GUI |
| 115 | + |
| 116 | +* Maybe add a web interface (implementing using Python's built-in webserver) would be easiest. |
0 commit comments