[PATCH 1/2] git-format: save dive picture data

Linus Torvalds torvalds at linux-foundation.org
Sun Jun 29 11:31:04 PDT 2014


From: Linus Torvalds <torvalds at linux-foundation.org>
Date: Sun, 29 Jun 2014 10:30:01 -0700
Subject: [PATCH 1/2] git-format: save dive picture data

This doesn't actually parse the data at load time yet, but I need a save
file to do that..

The diff looks larger than it is because this moves the "mktree()"
function up earlier to be used by the picture saving code.

Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>
---

I think we migth want to think more about the actual save format, but this 
encodes the time offset within the dive in the name of the picture data.  
That seems reasonable.

NOTE! I've not really used the subsurface picture stuff, so somebody who 
does and has used the git format should test this. It works for me, and 
the filenames look reasonable: it ends up doing things like this in my 
stupid tests:

 git show --stat:

  ...
    dive 525: Mala Pier, Maui (Maui, Hawaii)
    
    Suunto Vyper Air, Suunto HelO2, Uemis Zurich
    Created by subsurface 4.1-490-g238c905b1686

 2014/06/14-Maui/20-Fri-16:11:52/Pictures/+00:00:32 | 1 +
 2014/06/14-Maui/20-Fri-16:11:52/Pictures/+00:01:01 | 1 +
 2014/06/14-Maui/20-Fri-16:11:52/Pictures/+00:01:09 | 1 +
 2014/06/14-Maui/20-Fri-16:11:52/Pictures/+00:01:16 | 1 +
 2014/06/14-Maui/20-Fri-16:11:52/Pictures/+00:01:20 | 1 +
 2014/06/14-Maui/20-Fri-16:11:52/Pictures/+00:01:26 | 1 +
  ...

ie the picture files are all just one line long (it's just the "filename" 
line, since I don't have gps data on my pictures underwater), and they get 
saved as "Pictures/[offset]" in the dive directory.

So it all seems sane, but I think having somebody else use it and test it 
is a good idea.


 save-git.c | 76 +++++++++++++++++++++++++++++++++++++++++++++-----------------
 1 file changed, 56 insertions(+), 20 deletions(-)

diff --git a/save-git.c b/save-git.c
index af682820dbbf..f7a244a2a0fd 100644
--- a/save-git.c
+++ b/save-git.c
@@ -439,6 +439,26 @@ static struct dir *new_directory(struct dir *parent, struct membuffer *namebuf)
 	return subdir;
 }
 
+static struct dir *mktree(struct dir *dir, const char *fmt, ...)
+{
+	struct membuffer buf = { 0 };
+	struct dir *subdir;
+
+	VA_BUF(&buf, fmt);
+	for (subdir = dir->subdirs; subdir; subdir = subdir->sibling) {
+		if (subdir->unique)
+			continue;
+		if (strncmp(subdir->name, buf.buffer, buf.len))
+			continue;
+		if (!subdir->name[buf.len])
+			break;
+	}
+	if (!subdir)
+		subdir = new_directory(dir, &buf);
+	free_buffer(&buf);
+	return subdir;
+}
+
 /*
  * The name of a dive is the date and the dive number (and possibly
  * the uniqueness suffix).
@@ -499,6 +519,40 @@ static int save_one_divecomputer(git_repository *repo, struct dir *tree, struct
 	return ret;
 }
 
+static int save_one_picture(git_repository *repo, struct dir *dir, struct picture *pic)
+{
+	int offset = pic->offset.seconds;
+	struct membuffer buf = { 0 };
+	char sign = '+';
+	unsigned h;
+
+	show_utf8(&buf, "filename ", pic->filename, "\n");
+	show_gps(&buf, pic->latitude, pic->longitude);
+
+	/* Picture loading will load even negative offsets.. */
+	if (offset < 0) {
+		offset = -offset;
+		sign = '-';
+	}
+
+	/* Use full hh:mm:ss format to make it all sort nicely */
+	h = offset / 3600;
+	offset -= h *3600;
+	return blob_insert(repo, dir, &buf, "%c%02u:%02u:%02u",
+		sign, h, FRACTION(offset, 60));
+}
+
+static int save_pictures(git_repository *repo, struct dir *dir, struct dive *dive)
+{
+	if (dive->picture_list) {
+		dir = mktree(dir, "Pictures");
+		FOR_EACH_PICTURE(dive) {
+			save_one_picture(repo, dir, picture);
+		}
+	}
+	return 0;
+}
+
 static int save_one_dive(git_repository *repo, struct dir *tree, struct dive *dive, struct tm *tm)
 {
 	struct divecomputer *dc;
@@ -531,6 +585,8 @@ static int save_one_dive(git_repository *repo, struct dir *tree, struct dive *di
 		dc = dc->next;
 	} while (dc);
 
+	/* Save the picture data, if any */
+	save_pictures(repo, subdir, dive);
 	return 0;
 }
 
@@ -662,26 +718,6 @@ static int save_one_trip(git_repository *repo, struct dir *tree, dive_trip_t *tr
 	return 0;
 }
 
-static struct dir *mktree(struct dir *dir, const char *fmt, ...)
-{
-	struct membuffer buf = { 0 };
-	struct dir *subdir;
-
-	VA_BUF(&buf, fmt);
-	for (subdir = dir->subdirs; subdir; subdir = subdir->sibling) {
-		if (subdir->unique)
-			continue;
-		if (strncmp(subdir->name, buf.buffer, buf.len))
-			continue;
-		if (!subdir->name[buf.len])
-			break;
-	}
-	if (!subdir)
-		subdir = new_directory(dir, &buf);
-	free_buffer(&buf);
-	return subdir;
-}
-
 static void save_userid(void *_b)
 {
 	struct membuffer *b = _b;
-- 
2.0.0.154.g79f30a3



More information about the subsurface mailing list