µ¿±âÈ­ Áö¿ø

Eclipse 3.0ÀÇ »õ·Î¿î ±â´ÉÀº ÀÛ¾÷°ø°£ ÀÚ¿ø°ú ´Ù¸¥ À§Ä¡ÀÇ ÀÚ¿ø °£ µ¿±âÈ­ »óŸ¦ °ü¸®Çϰí Ç¥½ÃÇÏ´Â APIÀÔ´Ï´Ù. ÀÛ¾÷°ø°£ ¿ÜºÎÀÇ ÀÚ¿øÀ» º¯ÇüÀ̶ó°í ÇÕ´Ï´Ù. µ¿±âÈ­¶õ ´Ù¸¥ À§Ä¡ÀÇ ÀÚ¿ø °£ º¯°æ»çÇ×À» Ç¥½ÃÇÏ°í »ç¿ëÀÚ°¡ Á¶Ä¡¸¦ ¼öÇàÇÏ¿© µ¿±âÈ­ »óÅ¿¡ ¼±ÅÃÀûÀ¸·Î ¿µÇâÀ» ÁÙ ¼ö ÀÖ´Â ÀÛ¾÷À» ¸»ÇÕ´Ï´Ù. µ¿±âÈ­ API´Â RepositoryProvider API¿¡ ´ëÇØ Á÷±³À̸ç ÀúÀå¼Ò Á¦°øÀÚ ¾øÀÌ »ç¿ëµÉ ¼ö ÀÖ½À´Ï´Ù. µ¿±âÈ­ APIÀÇ ¸ñÀûÀº ÀÚ¿øÀÇ µ¿±âÈ­ »óŸ¦ Ç¥½ÃÇÏ´Â ´Ù¸¥ ¹æ¹ýÀÇ ±¸Çö Ÿ½ºÅ©¸¦ ½±°Ô ÇÏ´Â °ÍÀÔ´Ï´Ù. ±×·¯¹Ç·Î API´Â ÀÚ¿øÀÇ µ¿±âÈ­ »óŸ¦ Á¶È¸ÇÏ´Â ¼ö´ÜÀ» ÇÊ¿ä·Î ÇÏ´Â °ÍÀÌÁö »óÅ¿¡ ¿µÇâÀ» ÁÖ´Â ¼ö´ÜÀ» ÇÊ¿ä·Î ÇÏ´Â °ÍÀº ¾Æ´Õ´Ï´Ù. »óÅ¿¡ ¿µÇâÀ» ÁÖ´Â ¼ö´ÜÀº ±¸ÇöÀÚ¿¡ ³²¾Æ ÀÖ½À´Ï´Ù(UI°¡ ¸Þ´º¿¡ Á¦°øÀÚ Æ¯Á¤ ¸Þ´º Ç׸ñÀ» Ãß°¡ÇÏ´Â ÈÄÅ©¸¦ Á¦°øÇÏ´Â °æ¿ì Æ÷ÇÔ).

¿ë¾î

µ¿±âÈ­ API¸¦ ¼³¸íÇϱâ Àü¿¡ ÀÛ¾÷°ø°£ µ¿±âÈ­¸¦ ¼³¸íÇÒ ¶§ Àû¿ëµÇ´Â ¿ë¾î ¹× °³³äÀÇ ÀϺθ¦ ¼³¸íÇÏ´Â °ÍÀÌ À¯¿ëÇÕ´Ï´Ù.

ÀÚ¿ø º¯Çü: ´Ù¸¥ À§Ä¡¿¡ ÀÖ´Â ÀÚ¿ø¿¡ ¸ÊÇεǴ ·ÎÄà ÀÚ¿øÀ» ÇØ´ç ÀÚ¿øÀÇ º¯ÇüÀ̶ó°í ÇÒ ¼ö ÀÖ½À´Ï´Ù. Áï, ÀÚ¿øÀº ´ë°³ ¸Å¿ì À¯»çÇÏÁö¸¸ (·ÎÄà ÀÚ¿ø¿¡ ´ëÇÑ ¼öÁ¤»çÇ× ¶Ç´Â ±âŸ »ç¿ëÀÚ°¡ ¿ø°Ý »çº»¿¡ ÀÛ¼ºÇÑ º¯°æ»çÇ×À¸·Î ÀÎÇØ) ´Ù¼Ò ´Ù¸¦ ¼ö ÀÖ½À´Ï´Ù. ÀÌ¿¡ ´ëÇØ ·ÎÄà ÀÛ¾÷°ø°£ Á᫐ º¸±â¸¦ ÃëÇϹǷÎ, ·ÎÄà »çº»À» ÀÚ¿øÀ̶ó°í ÇÏ¸ç ¿ø°Ý »çº»À» ÀÚ¿ø º¯ÇüÀ̶ó°í ÇÕ´Ï´Ù.

µ¿±âÈ­: µ¿±âÈ­¶õ ÀÚ¿ø º¯Çü °£ Â÷À̸¦ »ç¿ëÀÚ¿¡°Ô Ç¥½ÃÇÏ´Â Á¶Ä¡¸¦ À̸¨´Ï´Ù. µ¿±âÈ­´Â º¯Çü »óÅ¿¡ ¿µÇâÀ» ÁÖÁö ¾ÊÁö¸¸ ´ë½Å ´Ù¸¥ º¯Çü ¼¼Æ® °£ Â÷À̸¦ »ç¿ëÀÚ°¡ ÀÌÇØÇÏ´Â µ¥ µµ¿òÀÌ µÇµµ·Ï º¸±â¸¦ Á¦°øÇÕ´Ï´Ù. ±×·¯³ª »ç¿ëÀÚ°¡ µ¿±âÈ­ ½Ã º¯Çü »óÅÂ(¿¹: üũÀÎ ¶Ç´Â µÇµ¹¸®±â Çã¿ë)¿¡ ¿µÇâÀ» ÁÖµµ·Ï Çã¿ëÇÏ´Â °ÍÀÌ ÀϹÝÀûÀÔ´Ï´Ù.

2¹æÇâ ¹× 3¹æÇâ µ¿±âÈ­: µ¿±âÈ­ »óÅ ÆÇº°¿¡´Â µÎ °¡Áö ±âº» À¯Çü(2¹æÇâ ¹× 3¹æÇâ)ÀÌ ÀÖ½À´Ï´Ù. 2¹æÇâ ºñ±³´Â ·ÎÄà ÀÚ¿ø ¹× ´ÜÀÏ ÀÚ¿ø º¯Çü¸¸ °í·ÁÇϸç, ¿ø°Ý ÀÚ¿ø º¯ÇüÀ̶ó°í ÇÕ´Ï´Ù. ÀÌ ºñ±³ À¯ÇüÀº µÎ ÀÚ¿ø °£ Â÷À̸¸ Ç¥½ÃÇÒ ¼ö ÀÖ°í, º¯°æ»çÇ×ÀÌ ¼­·Î °ü·ÃµÇ´Â ¹æ¹ý¿¡ ´ëÇØ¼­´Â ÈùÆ®¸¦ Á¦°øÇÒ ¼ö ¾ø½À´Ï´Ù. ´ëºÎºÐÀÇ ÄÚµå ÀúÀå¼Ò ½Ã½ºÅÛÀº µ¿±âÈ­ »óÅ ÆÇº°¿¡ 3¹æÇâ ºñ±³¸¦ Áö¿øÇÕ´Ï´Ù. ÀÌ ºñ±³ À¯Çü¿¡´Â ·ÎÄà ÀÚ¿ø, ¿ø°Ý ÀÚ¿ø º¯Çü ¹× ±âº» ÀÚ¿ø º¯ÇüÀÌ Æ÷ÇԵ˴ϴÙ. ±âº» ÀÚ¿ø º¯ÇüÀº ·ÎÄà ¹× ¿ø°Ý ÀÚ¿øÀÇ °øÅë »óÀ§¸¦ Ç¥½ÃÇÕ´Ï´Ù. À̰ÍÀº º¯°æÀÇ ¹æÇâÀ» Ç¥½ÃÇÏ´Â º¸´Ù º¹ÀâÇÑ µ¿±âÈ­ »óÅ¿¡ Çã¿ëµË´Ï´Ù.

Å×À̺í 1: µ¿±âÈ­ »óÅÂ

2¹æÇâ 3¹æÇâ
º¯°æµÊ
»èÁ¦µÊ
Ãß°¡µÊ
Àü¼Û º¯°æ
¼ö½Å º¯°æ
Àü¼Û »èÁ¦
¼ö½Å »èÁ¦
Àü¼Û Ãß°¡
¼ö½Å Ãß°¡
Ãæµ¹ º¯°æ
Ãæµ¹ »èÁ¦
Ãæµ¹ Ãß°¡

񃧯 - SyncInfo

org.eclipse.team.core.synchronizeÀÇ Å¬·¡½º´Â µ¿±âÈ­ »óŸ¦ ¼³¸íÇÏ´Â µ¥ »ç¿ëµË´Ï´Ù. °¡Àå Áß¿äÇÑ Å¬·¡½º´Â SyncInfoÀÔ´Ï´Ù. ÀÌÀ¯´Â µ¿±âÈ­ »óŸ¦ ½ÇÁ¦·Î Á¤ÀÇÇϴ Ŭ·¡½ºÀ̱⠶§¹®ÀÔ´Ï´Ù. ÀÌ Å¬·¡½º´Â ´ÙÀ½°ú °°ÀÌ »ç¿ëµÉ ¼ö ÀÖ½À´Ï´Ù.

SyncInfo info = getSyncInfo(resource); // this is a simulated method of obtaining the sync info for a resource
int changekind = info.getKind();
if(info.getResourceComparator().isThreeWay()) {
if((changeKind & SyncInfo.DIRECTION_MASK) == SyncInfo.INCOMING) {
// do something
}
} else if(changeKind == SyncInfo.CHANGE) {
// do something else
}

SyncInfo Ŭ·¡½º´Â 2¹æÇâ ¹× 3¹æÇâ ºñ±³ ¾Ë°í¸®ÁòÀ» ¸ðµÎ Á¦°øÇϹǷÎ, Ŭ¶óÀÌ¾ðÆ®´Â ÀÚ¿ø ¹× ÀÚ¿øÀ» ºñ±³ÇÒ ¼ö Àִ Ŭ·¡½º¸¦ Á¦°øÇØ¾ß ÇÕ´Ï´Ù(IResourceVariantComparator). ´ÙÀ½Àº ¿¹Á¦ º¯Çü ºñ±³±âÀÔ´Ï´Ù.

public class TimestampVariantComparator implements IResourceVariantComparator {	
protected boolean compare(IResourceVariant e1, IResourceVariant e2) {
if(e1.isContainer()) {
if(e2.isContainer()) {
return true;
}
return false;
}
if(e1 instanceof MyResourceVariant && e2 instanceof MyResourceVariant) {
MyResourceVariant myE1 = (MyResourceVariant)e1;
MyResourceVariant myE2 = (MyResourceVariant)e2;
return myE1.getTimestamp().equals(myE2.getTimestamp());
}
return false;
}
protected boolean compare(IResource e1, IResourceVariant e2) {

}
public boolean isThreeWay() {
return true;
}
}

SyncInfo info = new SyncInfo(resource, variant1, variant2, new TimestampComparator());
info.init(); // calculate the sync info

¶ÇÇÑ ÀÌ ÆÐŰÁö¿¡´Â SyncInfo¸¦ Æ÷ÇÔÇϵµ·Ï Ưº°È÷ ¼³°èµÈ ÄÝ·º¼Ç ¹× SyncInfo ÀνºÅϽº¿¡ Àû¿ëµÉ ¼ö ÀÖ´Â ÇÊÅ͵µ µé¾î ÀÖ½À´Ï´Ù.

µ¿±âÈ­ »óÅ °ü¸®

À§ÀÇ ¿¹Á¦¿¡¼­ È®ÀÎÇÑ ¹Ù¿Í °°ÀÌ SyncInfo ¹× IResourceVariantComparator Ŭ·¡½º´Â ÀÚ¿øÀÇ µ¿±âÈ­ »óÅ¿¡ ´ëÇÑ ¾×¼¼½º¸¦ Á¦°øÇÕ´Ï´Ù. ±×·¯³ª ¾ÆÁ÷ ´Ù·çÁö ¾ÊÀº °ÍÀº »óŸ¦ °ü¸®ÇÏ´Â ¹æ¹ýÀÔ´Ï´Ù. °¡ÀÔÀÚ´Â °¡ÀÔÀÚÀÇ ¼Ó¼º¿¡ µû¶ó 2¹æÇâ ¶Ç´Â 3¹æÇâ ºñ±³¸¦ »ç¿ëÇÏ¿© ·ÎÄà ÀÛ¾÷°ø°£ÀÇ ÀÚ¿ø°ú ÀÌ·¯ÇÑ ÀÚ¿øÀÇ ÀÚ¿ø º¯Çü ¼¼Æ® °£ µ¿±âÈ­ »óÅ¿¡ ´ëÇÑ ¾×¼¼½º¸¦ Á¦°øÇÕ´Ï´Ù. °¡ÀÔÀÚ´Â ´ÙÀ½°ú °°Àº ¼º´ÉÀ» Á¦°øÇÕ´Ï´Ù.

API´Â °¡ÀÔÀÚ¸¦ ÀÛ¼ºÇÏ´Â ¹æ¹ýÀ» Á¤ÀÇÇÏÁö ¾ÊÀ¸¹Ç·Î, À̴ ƯÁ¤ ±¸Çö¿¡ ³²¾Æ ÀÖ½À´Ï´Ù. ¿¹¸¦ µé¾î CVS Ç÷¯±×ÀÎÀº º´ÇÕÀÌ ¼öÇàµÉ ¶§ °¡ÀÔÀÚ, ºñ±³ ½Ã ´Ù¸¥ °¡ÀÔÀÚ ¹× ·ÎÄà ÀÛ¾÷°ø°£À» ÇöÀç ºÐ±â¿Í µ¿±âÈ­ÇÒ ¶§ ´Ù¸¥ °¡ÀÔÀÚ¸¦ °¢°¢ ÀÛ¼ºÇÕ´Ï´Ù.

±×·¯¹Ç·Î SyncInfo »ç¿ë¿¡ ´ëÇÑ Ã¹ ¹øÂ° ¿¹Á¦¸¦ ´Ù½Ã ¹æ¹®ÇÑ ÈÄ °¡ÀÔÀÚ¸¦ »ç¿ëÇÏ¿© SyncInfo¿¡ ¾×¼¼½ºÇÒ ¼ö ÀÖ´Â ¹æ¹ýÀ» »ìÆì º¸±â·Î ÇÕ´Ï´Ù.

// Create a file system subscriber and specificy that the
// subscriber will synchronize with the provided file system location
Subscriber subscriber = new FileSystemSubscriber("c:\temp\repo");

// Allow the subscriber to refresh its state
subscriber.refresh(subscriber.roots(), IResource.DEPTH_INFINITE, monitor);

// Collect all the synchronization states and print
IResource[] children = subscriber.roots();
for (int i = 0; i < children.length; i++) {
printSyncState(children[i]);
}

...

void printSyncState(Subscriber subscriber, IResource resource) {
System.out.println(subscriber.getSyncInfo(resource).toString());
IResource[] children = subscriber.members(resource);
for (int i = 0; i < children.length; i++) {
IResource child = children[i];
if(! child.exists()) {
System.out.println(resource.getFullPath() + " doesn't exist in the workspace");
}
printSyncState(subscriber, children[i]);
}
}

±â¾ïÇØ¾ß ÇÒ Áß¿äÇÑ Á¡Àº °¡ÀÔÀÚ°¡ ÀÛ¾÷°ø°£¿¡ Á¸ÀçÇÏÁö ¾Ê´Â ÀÚ¿ø¿¡ ´ëÇØ ¾Ë°í ÀÖ´Ù´Â Á¡°ú Subscriber#members() ¹× SyncInfo#getLocal()¿¡¼­ ±âÁ¸ ÀÚ¿øÀÌ ¾Æ´Ñ ÀÚ¿øÀ» ¸®ÅÏÇÒ ¼ö ÀÖ´Ù´Â Á¡ÀÔ´Ï´Ù.

UIÀÇ µ¿±âÈ­ »óÅ ǥ½Ã

µ¿±âÈ­ »óŸ¦ °ü¸®ÇÏ´Â ¹æ¹ýÀ» ¼³¸íÇÏ´Â µ¥ ½Ã°£À» ´õ ÇÒ¾ÖÇÒ ¼ö ÀÖÁö¸¸ ´ë½Å »ç¿ëÀÚ¿¡°Ô Ç¥½ÃµÈ »óŸ¦ ½ÇÁ¦·Î ¾ò´Â ¹æ¹ýÀ» È®ÀÎÇØ º¸±â·Î ÇÕ´Ï´Ù. ISynchronizeParticipant´Â µ¿±âÈ­ »óŸ¦ Ç¥½ÃÇÏ°í »ç¿ëÀÚ°¡ ÇØ´ç »óÅ¿¡ ¿µÇâÀ» ÁÖµµ·Ï ÇÏ´Â »ç¿ëÀÚ ÀÎÅÍÆäÀ̽º ±¸¼º¿ä¼ÒÀÔ´Ï´Ù. µ¿±âÈ­ º¸±â´Â µ¿±âÈ­ Âü¿©ÀÚ¸¦ Ç¥½ÃÇÏÁö¸¸ ´ëÈ­ »óÀÚ¿Í ¸¶¹ý»ç¿¡ ÀÌ·¯ÇÑ Âü¿©ÀÚ¸¦ Ç¥½ÃÇÒ ¼öµµ ÀÖ½À´Ï´Ù. »ç¿ëÀÚ(SyncInfo ¹× °¡ÀÔÀÚ¸¦ ±âÁØÀ¸·Î ÇÏÁö ¾ÊÀº °æ¿ìÀÌ´õ¶óµµ)°¡ µ¿±âÈ­ »óÅÂÀÇ ¸ðµç À¯ÇüÀ» »ç¿ëÀÚ¿¡°Ô Ç¥½ÃÇÏ´Â Áö¿øÀ» Á¦°øÇϱâ À§ÇØ Âü¿©ÀÚ´Â ¸Å¿ì ÀϹÝÀûÀÎ ±¸¼º¿ä¼ÒÀÔ´Ï´Ù.

µ¿±âÈ­ ÀÛ¼º ¸¶¹ý»ç¸¦ Ãß°¡Çϱâ À§ÇÑ org.eclipse.team.ui.synchronizeWizards¶ó´Â È®ÀåÁ¡µµ ÀÖ½À´Ï´Ù. ÀÌ È®ÀåÁ¡Àº »ç¿ëÀÚ°¡ »ç¿ëÀÚÀÇ µ¿±âÈ­ À¯ÇüÀ» ½±°Ô ÀÛ¼ºÇÒ ¼ö ÀÖµµ·Ï ±Û·Î¹ú µ¿±âÈ­ Á¶Ä¡ ¹× µ¿±âÈ­ º¸±â¿¡ ¸¶¹ý»ç¸¦ µÓ´Ï´Ù.

±×·¯³ª °¡ÀÔÀÚ¸¦ ±¸ÇöÇßÀ¸¸é ´ÙÀ½°ú °°Àº ±â´ÉÀ» Á¦°øÇÒ SubscriberParticipant¶ó´Â »ìÁ¦ Âü¿©ÀڷκÎÅÍ ÀåÁ¡À» ¾òÀ» ¼ö ÀÖ½À´Ï´Ù.

ÀÌ·¯ÇÑ °³³äÀ» ¼³¸íÇÏ´Â ÃÖ¼±ÀÇ ¹æ¹ýÀº ´Ü¼ø ¿¹Á¦ÀÇ ÄÁÅØ½ºÆ®¿¡¼­ »ç¿ëµÈ °³³äÀ» ÂüÁ¶ÇÏ´Â °ÍÀÔ´Ï´Ù. ·ÎÄà È÷½ºÅ丮 µ¿±âÈ­ ¿¹Á¦·Î À̵¿ÇÏ¿© ÀÌ ¸ðµç °³³äÀ» ÇÔ²² »ç¿ëÇÒ ¼ö ÀÖ´Â ¹æ¹ýÀ» ÂüÁ¶ÇϽʽÿÀ. ¶Ç´Â °í±Þ API¸¦ »ç¿ëÇÏ´Â ¹æ¹ýÀ» ã¾Æ º¸·Á¸é ¼¼ºÎ»çÇ×À¸·Î À̵¿ÇϽʽÿÀ.

¹ýÀû ÁÖÀÇ»çÇ×