/* Copyright (c) 2013-2014 Boundless and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Distribution License v1.0 * which accompanies this distribution, and is available at * https://www.eclipse.org/org/documents/edl-v10.html * * Contributors: * Victor Olaya (Boundless) - initial implementation */ package org.locationtech.geogig.api.porcelain; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkState; import org.locationtech.geogig.api.AbstractGeoGigOp; import org.locationtech.geogig.api.ObjectId; import org.locationtech.geogig.api.Platform; import org.locationtech.geogig.api.Ref; import org.locationtech.geogig.api.RevPerson; import org.locationtech.geogig.api.RevPersonImpl; import org.locationtech.geogig.api.RevTag; import org.locationtech.geogig.api.RevTagImpl; import org.locationtech.geogig.api.plumbing.HashObject; import org.locationtech.geogig.api.plumbing.RefParse; import org.locationtech.geogig.api.plumbing.UpdateRef; import com.google.common.base.Optional; import com.google.common.base.Preconditions; /** * Creates a new tag * */ public class TagCreateOp extends AbstractGeoGigOp<RevTag> { private String name; private ObjectId commitId; private String message; /** * Executes the tag creation operation. * * @return the created tag * */ @Override protected RevTag _call() throws RuntimeException { checkState(name != null, "tag name was not provided"); final String tagRefPath = Ref.TAGS_PREFIX + name; checkArgument(!command(RefParse.class).setName(tagRefPath).call().isPresent(), "A tag named '" + name + "' already exists."); if (commitId == null) { final Optional<Ref> currHead = command(RefParse.class).setName(Ref.HEAD).call(); Preconditions.checkState(currHead.isPresent(), "Repository has no HEAD, can't create tag"); commitId = currHead.get().getObjectId(); } RevPerson tagger = resolveTagger(); message = message == null ? "" : message; RevTag tag = new RevTagImpl(ObjectId.NULL, name, commitId, message, tagger); ObjectId id = command(HashObject.class).setObject(tag).call(); tag = new RevTagImpl(id, name, commitId, message, tagger); objectDatabase().put(tag); Optional<Ref> branchRef = command(UpdateRef.class).setName(tagRefPath) .setNewValue(tag.getId()).call(); checkState(branchRef.isPresent()); return tag; } public TagCreateOp setMessage(String message) { this.message = message; return this; } public TagCreateOp setCommitId(ObjectId commitId) { this.commitId = commitId; return this; } public TagCreateOp setName(String name) { this.name = name; return this; } private RevPerson resolveTagger() { final String nameKey = "user.name"; final String emailKey = "user.email"; Optional<String> name = command(ConfigGet.class).setName(nameKey).call(); Optional<String> email = command(ConfigGet.class).setName(emailKey).call(); checkState( name.isPresent(), "%s not found in config. Use geogig config [--global] %s <your name> to configure it.", nameKey, nameKey); checkState( email.isPresent(), "%s not found in config. Use geogig config [--global] %s <your email> to configure it.", emailKey, emailKey); String taggerName = name.get(); String taggerEmail = email.get(); Platform platform = platform(); long taggerTimeStamp = platform.currentTimeMillis(); int taggerTimeZoneOffset = platform.timeZoneOffset(taggerTimeStamp); return new RevPersonImpl(taggerName, taggerEmail, taggerTimeStamp, taggerTimeZoneOffset); } }