summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEdward Thomson <ethomson@microsoft.com>2014-10-04 20:17:26 -0400
committerEdward Thomson <ethomson@microsoft.com>2014-10-26 22:59:50 -0400
commit979645a7195b8ce9895c18ee00c8913ea38f93eb (patch)
tree8b894001847a82bb24d6d0484980ae26fc6b7efa
parent18b00406c6427eb8c9d96864448474e1d85017de (diff)
downloadlibgit2-979645a7195b8ce9895c18ee00c8913ea38f93eb.tar.gz
rebase: updates based on PR comments
-rw-r--r--include/git2.h1
-rw-r--r--include/git2/rebase.h32
-rw-r--r--src/rebase.c48
3 files changed, 47 insertions, 34 deletions
diff --git a/include/git2.h b/include/git2.h
index 5e032b2bf..41adbbad2 100644
--- a/include/git2.h
+++ b/include/git2.h
@@ -40,6 +40,7 @@
#include "git2/patch.h"
#include "git2/pathspec.h"
#include "git2/push.h"
+#include "git2/rebase.h"
#include "git2/refdb.h"
#include "git2/reflog.h"
#include "git2/refs.h"
diff --git a/include/git2/rebase.h b/include/git2/rebase.h
index 24d8fcf71..095975edb 100644
--- a/include/git2/rebase.h
+++ b/include/git2/rebase.h
@@ -84,21 +84,19 @@ typedef enum {
typedef struct {
/** The type of rebase operation. */
- unsigned int type;
+ git_rebase_operation_t type;
- union {
- /**
- * The commit ID being cherry-picked. This will be populated for
- * all operations except those of type `GIT_REBASE_OPERATION_EXEC`.
- */
- const git_oid id;
+ /**
+ * The commit ID being cherry-picked. This will be populated for
+ * all operations except those of type `GIT_REBASE_OPERATION_EXEC`.
+ */
+ const git_oid id;
- /**
- * The executable the user has requested be run. This will only
- * be populated for operations of type `GIT_REBASE_OPERATION_EXEC`.
- */
- const char *exec;
- };
+ /**
+ * The executable the user has requested be run. This will only
+ * be populated for operations of type `GIT_REBASE_OPERATION_EXEC`.
+ */
+ const char *exec;
} git_rebase_operation;
/**
@@ -115,7 +113,7 @@ GIT_EXTERN(int) git_rebase_init_options(
unsigned int version);
/**
- * Initializes a rebase operation to rebase the changes in `ours`
+ * Initializes a rebase operation to rebase the changes in `branch`
* relative to `upstream` onto another branch. To begin the rebase
* process, call `git_rebase_next`. When you have finished with this
* object, call `git_rebase_free`.
@@ -127,7 +125,7 @@ GIT_EXTERN(int) git_rebase_init_options(
* reachable commits
* @param onto The branch to rebase onto, or NULL to rebase onto the given
* upstream
- * @param signature The signature of the rebaser
+ * @param signature The signature of the rebaser (optional)
* @param opts Options to specify how rebase is performed
* @return Zero on success; -1 on failure.
*/
@@ -242,7 +240,7 @@ GIT_EXTERN(int) git_rebase_abort(
* been applied.
*
* @param rebase The rebase that is in-progress
- * @param signature The identity that is finishing the rebase
+ * @param signature The identity that is finishing the rebase (optional)
* @param opts Options to specify how rebase is finished
* @param Zero on success; -1 on error
*/
@@ -254,7 +252,7 @@ GIT_EXTERN(int) git_rebase_finish(
/**
* Frees the `git_rebase` object.
*
- * @param rebase The rebase that is in-progress
+ * @param rebase The rebase object
*/
GIT_EXTERN(void) git_rebase_free(git_rebase *rebase);
diff --git a/src/rebase.c b/src/rebase.c
index 6905d17dd..6453ecc67 100644
--- a/src/rebase.c
+++ b/src/rebase.c
@@ -23,28 +23,28 @@
#include <git2/revwalk.h>
#include <git2/notes.h>
-#define REBASE_APPLY_DIR "rebase-apply"
-#define REBASE_MERGE_DIR "rebase-merge"
+#define REBASE_APPLY_DIR "rebase-apply"
+#define REBASE_MERGE_DIR "rebase-merge"
-#define HEAD_NAME_FILE "head-name"
-#define ORIG_HEAD_FILE "orig-head"
-#define HEAD_FILE "head"
-#define ONTO_FILE "onto"
-#define ONTO_NAME_FILE "onto_name"
-#define QUIET_FILE "quiet"
+#define HEAD_NAME_FILE "head-name"
+#define ORIG_HEAD_FILE "orig-head"
+#define HEAD_FILE "head"
+#define ONTO_FILE "onto"
+#define ONTO_NAME_FILE "onto_name"
+#define QUIET_FILE "quiet"
-#define MSGNUM_FILE "msgnum"
-#define END_FILE "end"
-#define CMT_FILE_FMT "cmt.%" PRIuZ
-#define CURRENT_FILE "current"
-#define REWRITTEN_FILE "rewritten"
+#define MSGNUM_FILE "msgnum"
+#define END_FILE "end"
+#define CMT_FILE_FMT "cmt.%" PRIuZ
+#define CURRENT_FILE "current"
+#define REWRITTEN_FILE "rewritten"
-#define ORIG_DETACHED_HEAD "detached HEAD"
+#define ORIG_DETACHED_HEAD "detached HEAD"
-#define NOTES_DEFAULT_REF NULL
+#define NOTES_DEFAULT_REF NULL
-#define REBASE_DIR_MODE 0777
-#define REBASE_FILE_MODE 0666
+#define REBASE_DIR_MODE 0777
+#define REBASE_FILE_MODE 0666
typedef enum {
GIT_REBASE_TYPE_NONE = 0,
@@ -948,6 +948,7 @@ static int rebase_copy_note(
{
git_note *note = NULL;
git_oid note_id;
+ git_signature *who = NULL;
int error;
if ((error = git_note_read(&note, rebase->repo, opts->rewrite_notes_ref, from)) < 0) {
@@ -959,11 +960,24 @@ static int rebase_copy_note(
goto done;
}
+ if (!committer) {
+ if((error = git_signature_default(&who, rebase->repo)) < 0) {
+ if (error != GIT_ENOTFOUND ||
+ (error = git_signature_now(&who, "unknown", "unknown")) < 0)
+ goto done;
+
+ giterr_clear();
+ }
+
+ committer = who;
+ }
+
error = git_note_create(&note_id, rebase->repo, git_note_author(note),
committer, opts->rewrite_notes_ref, to, git_note_message(note), 0);
done:
git_note_free(note);
+ git_signature_free(who);
return error;
}