Introduce commit notes
Commit notes are blobs which are shown together with the commit message. These blobs are taken from the notes ref, which you can configure by the config variable core.notesRef, which in turn can be overridden by the environment variable GIT_NOTES_REF. The notes ref is a branch which contains "files" whose names are the names of the corresponding commits (i.e. the SHA-1). The rationale for putting this information into a ref is this: we want to be able to fetch and possibly union-merge the notes, maybe even look at the date when a note was introduced, and we want to store them efficiently together with the other objects. Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
5832d1a9da
commit
879ef2485d
68
notes.c
Normal file
68
notes.c
Normal file
@ -0,0 +1,68 @@
|
||||
#include "cache.h"
|
||||
#include "commit.h"
|
||||
#include "notes.h"
|
||||
#include "refs.h"
|
||||
#include "utf8.h"
|
||||
#include "strbuf.h"
|
||||
|
||||
static int initialized;
|
||||
|
||||
void get_commit_notes(const struct commit *commit, struct strbuf *sb,
|
||||
const char *output_encoding)
|
||||
{
|
||||
static const char *utf8 = "utf-8";
|
||||
struct strbuf name = STRBUF_INIT;
|
||||
const char *hex;
|
||||
unsigned char sha1[20];
|
||||
char *msg;
|
||||
unsigned long msgoffset, msglen;
|
||||
enum object_type type;
|
||||
|
||||
if (!initialized) {
|
||||
const char *env = getenv(GIT_NOTES_REF_ENVIRONMENT);
|
||||
if (env)
|
||||
notes_ref_name = getenv(GIT_NOTES_REF_ENVIRONMENT);
|
||||
else if (!notes_ref_name)
|
||||
notes_ref_name = GIT_NOTES_DEFAULT_REF;
|
||||
if (notes_ref_name && read_ref(notes_ref_name, sha1))
|
||||
notes_ref_name = NULL;
|
||||
initialized = 1;
|
||||
}
|
||||
|
||||
if (!notes_ref_name)
|
||||
return;
|
||||
|
||||
strbuf_addf(&name, "%s:%s", notes_ref_name,
|
||||
sha1_to_hex(commit->object.sha1));
|
||||
if (get_sha1(name.buf, sha1))
|
||||
return;
|
||||
|
||||
if (!(msg = read_sha1_file(sha1, &type, &msglen)) || !msglen ||
|
||||
type != OBJ_BLOB)
|
||||
return;
|
||||
|
||||
if (output_encoding && *output_encoding &&
|
||||
strcmp(utf8, output_encoding)) {
|
||||
char *reencoded = reencode_string(msg, output_encoding, utf8);
|
||||
if (reencoded) {
|
||||
free(msg);
|
||||
msg = reencoded;
|
||||
msglen = strlen(msg);
|
||||
}
|
||||
}
|
||||
|
||||
/* we will end the annotation by a newline anyway */
|
||||
if (msglen && msg[msglen - 1] == '\n')
|
||||
msglen--;
|
||||
|
||||
strbuf_addstr(sb, "\nNotes:\n");
|
||||
|
||||
for (msgoffset = 0; msgoffset < msglen;) {
|
||||
int linelen = strchrnul(msg, '\n') - msg;
|
||||
|
||||
strbuf_addstr(sb, " ");
|
||||
strbuf_add(sb, msg + msgoffset, linelen);
|
||||
msgoffset += linelen;
|
||||
}
|
||||
free(msg);
|
||||
}
|
Reference in New Issue
Block a user